package com.only.common.util.ssh;

import cn.hutool.core.util.StrUtil;
import com.only.common.util.ListAndStringConverter;
import lombok.Data;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

/**
 * 一条或者一批指令
 * @author only
 * @date 2023/12/15
 * @description
 */
@Data
public class SshCommand {
    /**
     * 原生的指令内容
     */
    private String rawCommands;

    /**
     * 解析后的单条指令内容
     */
    private List<String> commands;

    public SshCommand(String commands) {
        // 处理commands
//        if (StringUtil.isEmpty(commands)) {
//            // 拼接多几个回车，处理部分控制台卡死的问题
//            String[] commnandRows = commands.split("\n");
//            StringBuilder commandBuilder = new StringBuilder("\n");
//            for (String command: commnandRows) {
//                commandBuilder.append(command).append("\n\n\n");
//            }
//            this.rawCommands = commandBuilder.toString();
//        }else {
//            this.rawCommands = commands;
//        }
        this.rawCommands = commands;
        this.commands = parsingCommands(commands);
    }

    /**
     * 构建 ‘与’ 指令，这些指令会一条一条执行，如果其中一条执行失败，后续的指令将不再执行
     * @return
     */
    public String buildCommandsByAnd() {
        return ListAndStringConverter.listToString(this.commands, " && ");
    }

    /**
     * 构建 ‘或’ 指令，这些指令会一条一条执行，如果其中一条执行失败，后续的指令将不再执行
     * @return
     */
    public String buildCommandsByOr() {
        return ListAndStringConverter.listToString(this.commands, " || ");
    }

    /**
     * 会返回原生指令的内容
     * @return
     */
    public String buildCommand() {
        return rawCommands;
    }

    private List<String> parsingCommands(String commands) {
        List<String> cmds = Arrays.asList(commands.trim().replace("\r", "").split("\n"));
        return cmds
            .stream()
            .map(String::trim)
            .filter(line -> StrUtil.isNotBlank(line) && !line.startsWith("#"))
            .collect(Collectors.toList());
    }
}
